/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年01月20日
 * 项目： rainhy-cores-webcore
 */
package com.rainhy.incrementer.context;

import org.springframework.beans.factory.InitializingBean;

/**
 * 
 * 自增长器容器
 * 
 * @author rain
 * @version [版本号, 2016年1月21日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class IncrementerContext extends IncrementerContextBuilder implements InitializingBean {
    
    /** 自身唯一引用 */
    private static IncrementerContext context;
    
    /** 自身唯一引用 */
    public static IncrementerContext getContext() {
        return IncrementerContext.context;
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        IncrementerContext.context = this;
        super.afterPropertiesSet();
    }
    
    /** 获取下一个值 */
    public int nextInt(IncrementerType incrementerType) {
        return Long.valueOf(nextLong(incrementerType)).intValue();
    }
    
    /** 获取下一个值 */
    public int nextInt(String incrementerType) {
        return Long.valueOf(nextLong(incrementerType)).intValue();
    }
    
    /** 获取下一个值 */
    public long nextLong(IncrementerType incrementerType) {
        return getNext(incrementerType.incrementerType(), incrementerType.incrementerCacheSize(), incrementerType.incrementerStartValue());
    }
    
    /** 获取下一个值 */
    public long nextLong(String incrementerType) {
        return getNext(incrementerType, getIncrementerCacheSize(), getIncrementerStartValue());
    }
    
    /** 获取下一个值 */
    public String nextString(IncrementerType incrementerType) {
        return String.valueOf(nextLong(incrementerType));
    }
    
    /** 获取下一个值 */
    public String nextString(String incrementerType) {
        return String.valueOf(nextLong(incrementerType));
    }
    
    /** 获取下一个值 */
    private synchronized long getNext(String incrementerType, int cacheSize, int startValue) {
        IncrementerProducer producer = getIncrementerProducer();
        return producer.getNextValue(incrementerType, cacheSize, startValue);
    }
}